将StringBuilder
构造函数标记为显式我认为我无法传递,char*
但似乎我可以编译就好了.
class StringBuilder { public: // StringBuilder(const char *); explicit StringBuilder(std::string s) {} }; int main() { StringBuilder s1("hello"); StringBuilder s2(std::string("hello")); }
http://cpp.sh/6uomq
basic_string
采用字符指针的构造函数不是explicit
:
basic_string( const CharT* s, Allocator& alloc = Allocator() );
这意味着为函数提供char指针string
将隐式创建一个字符串并将其传递给函数.
你是StringBuilder
明确的,这意味着它不可能隐式转换string
为StringBuilder
,即如果你传递string
给一个StringBuilder
作为参数的函数,它将无法编译.
编辑:如@Revolver_Ocelot所述,您可以将违规构造函数(StringBuilder(const char*)
)声明为已删除,以防止其被使用.如果你不能使用C++ 11,你只需要声明与private相同的构造函数并省略定义(实现):
class StringBuilder { public: explicit StringBuilder(const std::string& s) {} // for C++11 use this: StringBuilder(const char*) = delete; // otherwise use this: private: StringBuilder(const char*); // no implementation };